#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef tuple<int,int,int> tpi;
class dsu{
  private:
    vector<int> f;
  public:
    dsu(int n){
      f.resize(n),iota(f.begin(),f.end(),0);
    }
    int leader(int x){
      return x==f[x]?x:f[x]=leader(f[x]);
    }
    inline void merge(int x,int y){
      f[leader(x)]=leader(y);
    }
    inline bool same(int x,int y){
      return leader(x)==leader(y);
    }
};
int main(){
  freopen("shu.in","r",stdin);
  freopen("shu.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,m,q; bool chain=true; cin>>n>>m>>q;
  vector<vector<int> > g(n);
  vector<tpi> Q(q);
  for(int i=1;i<n;i++){
    int u,v; cin>>u>>v;
    chain&=(--u==i-1);
    chain&=(--v==i);
    g[u].emplace_back(v);
    g[v].emplace_back(u);
  }
  for(auto &i:Q){
    cin>>get<0>(i)>>get<1>(i)>>get<2>(i);
    get<0>(i)--,get<1>(i)--;
  }
  vector<int> d(n,-1);
  for(int i=0;i<m;i++){
    int c,e; cin>>c>>e,d[c-1]=max(d[c-1],e);
  }
  if(max({n,m,q})<=1000){
    vector<vector<int> > l(n,vector<int>(n));
    for(int i=0;i<n;i++){
      function<void(int,int)> dfs=[&](int u,int f){
        for(int j:g[u])
          if(j!=f)l[i][j]=l[i][u]+1,dfs(j,u);
      };
      dfs(i,i);
    }
    vector<vector<int> > g2(n);
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
        if(i!=j&&~min(d[i],d[j])&&d[i]>=l[i][j])
          g2[i].emplace_back(j);
    for(auto i:Q){
      if(l[get<0>(i)][get<1>(i)]<=max(d[get<0>(i)],get<2>(i))){
        cout<<"YES\n"; continue;
      }
      vector<bool> b(n); queue<int> q;
      for(int j=0;j<n;j++)
        if(~d[j]&&l[get<0>(i)][j]<=max(d[get<0>(i)],get<2>(i)))
          b[j]=true,q.emplace(j);
      bool f=false;
      while(!q.empty()){
        int u=q.front(); q.pop();
        if(l[u][get<1>(i)]<=d[u]){
          f=true; break;
        }
        for(int j:g2[u])
          if(!b[j])b[j]=true,q.emplace(j);
      }
      cout<<(f?"YES\n":"NO\n");
    }
  }
  return 0;
}